package com.supconit.video.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.supconit.video.service.MonitorService;
import com.supconit.video.utils.AjaxMessage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Copyright@ 浙江浙大中控信息技术有限公司
 *
 * @ClassName MonitorServiceImpl
 * @Description TODO  获取监控点预览取流URLv2
 * @Author YANJUN.WAN
 * @Date 2021/6/4 13:30
 */
@Service
public class MonitorServiceImpl implements MonitorService {
    /**
     * TODO 海康对外接口文档在线地址    https://open.hikvision.com/docs/69d3d37a56ec4d24a6596c3e6ed436af
     * */

    @Value("${videosurveillance.hikvision.host}")
    private String host;

    @Value("${videosurveillance.hikvision.appKey}")
    private String appKey;

    @Value("${videosurveillance.hikvision.appSecret}")
    private String appSecret;

    @Value("${videosurveillance.hikvision.artemis_path}")
    private String artemis_path;

    @Value("${videosurveillance.hikvision.uri}")
    private String uri;

    @Value("${videosurveillance.hikvision.http}")
    private String http;

    @Value("${videosurveillance.hikvision.protocol}")
    private String protocol;

    @Value("${videosurveillance.hikvision.streamType}")
    private String streamType;

    @Value("${videosurveillance.hikvision.transmode}")
    private String transmode;

    @Value("${videosurveillance.hikvision.expand}")
    private String expand;


    @Override
    public AjaxMessage getPreviewURLs(String cameraCode) {
       /* //校验设备是否有摄像头信息
        MonitorPO monitorPO = this.baseMapper.queryMonitorDataByDeviceId(cameraCode);
        if (null == monitorPO) {
            return AjaxMessage.error("未找到物联网设备对应摄像头信息");
        }*/
        try {
            //STEP1：设置平台参数，根据实际情况,设置host appkey appsecret 三个参数.
            ArtemisConfig.host = host; // artemis网关服务器ip端口
            ArtemisConfig.appKey = appKey;  // 秘钥appkey
            ArtemisConfig.appSecret = appSecret;// 秘钥appSecret
            //STEP2：设置OpenAPI接口的上下文
            final String ARTEMIS_PATH = artemis_path;
            // STEP3：设置接口的URI地址
            final String previewURLsApi = ARTEMIS_PATH + uri;
            Map<String, String> path = new HashMap<String, String>(2) {
                {
                    put(http, previewURLsApi);//根据现场环境部署确认是http还是https
                }
            };
            //STEP4：设置参数提交方式
            String contentType = "application/json";
            //STEP5：组装请求参数
            /**
             *  TODO 获取监控点预览取流URLv2 接口参数说明
             *      1、ameraIndexCode	string	True	监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode
             *      2、streamType	integer	False	码流类型，0:主码流 1:子码流  2:第三码流 参数不填，默认为主码流
             *      3、protocol	string	False	取流协议（应用层协议）， “hik”:HIK私有协议，使用视频SDK进行播放时，传入此类型； “rtsp”:RTSP协议； “rtmp”:RTMP协议； “hls”:HLS协议（HLS协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备；只支持H264视频编码和AAC音频编码）。 参数不填，默认为HIK协议
             *      4、transmode	integer	False	传输协议（传输层协议），0:UDP 1:TCP 默认是TCP 注：GB28181 2011及以前版本只支持UDP传输
             *      5、expand	string	False	标识扩展内容，格式：key=value， 调用方根据其播放控件支持的解码格式选择相应的封装类型；多个扩展时，以“&”隔开；支持的内容详见附录F expand扩展内容说明
             *      6、streamform	string	False	输出码流转封装格式，“ps”:PS封装格式、“rtp”:RTP封装协议。当protocol=rtsp时生效，且不传值时默认为RTP封装协议。
             *  */
            JSONObject jsonBody = new JSONObject();
            jsonBody.put("cameraIndexCode",cameraCode);
            jsonBody.put("streamType", streamType);
            jsonBody.put("protocol", protocol);
            jsonBody.put("transmode", transmode);
            jsonBody.put("expand", expand);
            String body = jsonBody.toJSONString();
            //STEP6：调用接口
            String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);// post请求application/json类型参数
            if (result != null) {
                JSONObject jsonObject = JSONObject.parseObject(result);
                if (jsonObject.getString("code").equals("0")) {
                    return AjaxMessage.success().data(jsonObject.getJSONObject("data").getString("url"));
                } else {
                    return AjaxMessage.error(jsonObject.getString("msg"));
                }
            } else {
                return AjaxMessage.error("请检查视频地址连接");
            }
        } catch (Exception e) {
            return AjaxMessage.error("获取视频监控地址异常！");
        }
    }
}
